package com.qf.factories;

import com.qf.dao.UserDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;

/**
 * 向spring容器中添加一个SqlSessionFactory对象
 */
@Component
public class SSFFactory {

    /**
     * 将该方法的返回值对象添加到spring容器中
     *  如果没有指定对象的名称，默认名称是 方法名 （ssf1）
     *  如果指定了名称，对象名称就是指定的
     *
     * ** 注意：@Bean注解要生效，该注解标注方法所在的类必须在spring容器中
     */
    @Bean("ssf")
    public static SqlSessionFactory ssf1() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

        return factory;
    }

//    @Autowired
//    private UserDao userDao;

    /**
     * 方法参数上的对象注入，可以省略 @Autowired
     *  如果要通过@Qualifier强制查找指定名称的对象注入，那么@Qualifier是不可以省略的
     */
    @Bean
//    public SqlSessionFactory ssf2(@Autowired UserDao userDao) throws IOException {
    public SqlSessionFactory ssf2(@Qualifier("userDaoImpl1") UserDao userDao) throws IOException {

        System.out.println("userDao:" + userDao);

        InputStream is = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

        return factory;
    }

    @Bean("sqlSessionFactory")
    public SqlSessionFactoryBean ssf3(){
        return new SqlSessionFactoryBean();
    }
}
